<?


JCAT_Package::ImportClass('JCAT_Controller',JCAT::PACKAGE_MVC) ;

abstract class CoderBase extends JCAT_Controller implements IToolboxCoder
{
	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function CoderBase( $sName )
	{
		JCAT_ASSERT::ASSERT_STRING($sName) ;
		$this->JCAT_Controller($sName) ;		
	}
	
	/**
	 * 初始化相关的 MVC 对象
	 * 
	 * @access	public
	 * @param 	$aMainDoc	CoderDocBase
	 * @return	void
	 */
	public function Initialize(CoderDocBase $aMainDoc)
	{
		// 对话框 视图
		$aView = new CoderDlgBase($this) ;
		
		if($aMainDoc)
		{
			$aView->SetDocument($aMainDoc,'MainDoc') ;
		}
		
		$this->AddView($aView) ;
	}
	
	
	/**
	 * what's this
	 * 
	 * @access	protected
	 * @return	void
	 */
	protected function Waiting()
	{
		// 初始化 对话框 视图
		$aView = $this->GetView('CoderDlgBase') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aView,'CoderDlgBase',JCAT_Language::Sentence('CoderBase类型的控制器，不能缺少CoderDlgBase视图')) ;
		
		// 进入堵塞
		$aView->DoDialog() ;
	}
	
	/**
	 * 
	 *
	 * @access	public
	 * @return	string
	 */
	public function MainRun($arrArgv=array())
	{
		// 设置启动参数
		$sPath = isset($arrArgv['path'])? $arrArgv['path']: '' ;			
		
		// 初始化 对话框 视图
		$aView = $this->GetView('CoderDlgBase') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aView,'CoderDlgBase',JCAT_Language::Sentence('CoderBase类型的控制器，不能缺少CoderDlgBase视图')) ;

		// 创建对话框（但不显示）
		$aView->ShowView(false) ;
		$aView->GetWidget()->set_title($this->GetDialogTitle()) ;
		
		// 主文档
		$aDoc = $this->GetDocument('MainDoc') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aDoc,'CoderDocBase',JCAT_Language::Sentence('CoderBase类型的控制器，不能缺少 MainDoc 文档'));
			
		// 加载对话框数据
		if( is_file($sPath) )
		{
			$aDoc->SetPath($sPath) ;
		
			try
			{
				$aDoc->Serialize( JCAT_Document::Load ) ;
			}
			catch (Exception $aException)
			{
				// 将 断言异常 抛出
				if( get_class($aException)=='JCAT_ASSERTException' )
					throw $aException ;
					
				JCAT_Gtk::MsgDlg($aException->getMessage()) ;
			}
		}
		
		// 初始化 目录
		else if( is_dir($sPath) )
		{
			$this->SetPath($sPath) ;
			$aDoc->SetChanged(false,true) ;
		}

		$aDoc->UpdateAllView() ;
		echo 1 ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function SetPath( $sPath )
	{
		JCAT_ASSERT::ASSERT_PATH($sPath) ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function GetPath()
	{
	}


	/**
	 * 保存
	 * 
	 * @access	public
	 * @return	bool
	 */
	public function Save()
	{
		if( !$this->OnApplication() )
		{
			return false ;
		}

		$aDoc = $this->GetDocument('MainDoc') ;
		JCAT_ASSERT::ASSERT_INSTANCE($aDoc,'CoderDocBase');

		$sPath = $this->GetPath() ;

		if( !$sPath or is_dir($sPath) ) 
		{
			JCAT_Gtk::MsgDlg( JCAT_Language::Sentence('请输入一个文件路径。') ) ;
			return false ;
		}

		// 保存  对话框 数据
		$aDoc->SetPath($sPath) ;
		if( !$aDoc->Serialize(JCAT_Document::Save) )
		{
			return false ;
		}

		// 更新文档状态
		$aDoc->SetChanged(false,true) ;

		return true ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	string
	 */
	abstract public function GetDialogTitle() ;


	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$nOperation		int		
	 * @return	void
	 */
	public function SetOperation( $nOperation )
	{
		$this->nOperation = $nOperation ;
	}
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function GetOperation()
	{
		return $this->nOperation ;
	}
	
	
	// 属性  ////////////////////////////////////////////////////
	
	/**
	 * 创建新文档，或 编辑存在的文档
	 * 
	 * @access	private
	 * @var		int
	 */
	private $nOperation = self::OP_CREATE ;

	
	/**
	 * 建新文档
	 * 
	 * @access	const
	 * @var		int
	 */
	const OP_CREATE = 1 ;
	
	/**
	 * 编辑存在的文档
	 * 
	 * @access	const
	 * @var		int
	 */
	const OP_EDIT = 2 ;
}

?>